package me.qixiaobo.enums;


import cn.hutool.core.util.ObjectUtil;

import java.util.EnumSet;

/**
 * 枚举通用接口
 *
 * @Description IBaseEnum
 * @Author guoyb
 * @Date 2024/1/17 17:18
 */
public interface BaseEnum<T> {

	T getCode();

	String getDesc();

	/**
	 * 根据值获取枚举
	 *
	 * @param code
	 * @param clazz
	 * @param <E>   枚举
	 * @return
	 */
	static <E extends Enum<E> & BaseEnum> E getEnumByCode(Object code, Class<E> clazz) {

		if (code == null) {
			return null;
		}

		EnumSet<E> allEnums = EnumSet.allOf(clazz); // 获取类型下的所有枚举
		E matchEnum = allEnums.stream()
				.filter(e -> ObjectUtil.equal(e.getCode(), code))
				.findFirst()
				.orElse(null);
		return matchEnum;
	}

	/**
	 * 根据文本标签获取值
	 *
	 * @param code
	 * @param clazz
	 * @param <E>
	 * @return
	 */
	static <E extends Enum<E> & BaseEnum> String getDescByCode(Object code, Class<E> clazz) {
		if (code == null) {
			return null;
		}

		EnumSet<E> allEnums = EnumSet.allOf(clazz); // 获取类型下的所有枚举
		E matchEnum = allEnums.stream()
				.filter(e -> ObjectUtil.equal(e.getCode(), code))
				.findFirst()
				.orElse(null);

		String label = null;
		if (matchEnum != null) {
			label = matchEnum.getDesc();
		}
		return label;
	}


	/**
	 * 根据文本标签获取值
	 *
	 * @param desc
	 * @param clazz
	 * @param <E>
	 * @return
	 */
	static <E extends Enum<E> & BaseEnum> Object getValueByLabel(String desc, Class<E> clazz) {
		if (desc == null) {
			return null;
		}

		EnumSet<E> allEnums = EnumSet.allOf(clazz); // 获取类型下的所有枚举
		E matchEnum = allEnums.stream()
				.filter(e -> ObjectUtil.equal(e.getDesc(), desc))
				.findFirst()
				.orElse(null);

		Object value = null;
		if (matchEnum != null) {
			value = matchEnum.getCode();
		}
		return value;
	}

}
